#include<iostream>
using namespace std;
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>


int main(){
    //1:创建新的会话组
    pid_t id = fork();
    if(id > 0){
        //父进程
        exit(0);//父进程直接退出
    }else if(id ==0){
        //子进程
        setsid();//创建新的会话组，并且子进程为组长

        //2:更改当前执行目录，确保不会被删除(不是必须)
        chdir(".");//这里就直接定位到当前路径

        //3:重设文件权限掩码
        umask(0);
        close(0);//关闭标准输入stdin文件描述符

        //4:关闭3个默认的文件描述符,或者将他们重定向到null文件中
        int fd = open("/dev/null",O_RDONLY);//fd --> 0
        if(fd == -1){
            perror("open errno");
            return 1;
        }

        dup2(fd,1);//重定向fd到1，也就是让1也指向黑洞文件，这样stdout也是输出到null中了
        dup2(fd,2);
        //到这里，后面再想打开文件，文件描述符就是从3开始了。

        //5：主要的业务逻辑
        while(1);//守护进程是不会退出的
        

    }



    return 0;
}